#pragma once

#include <cstddef>
#include <vector>

namespace skip_list {
    // 跳表节点类
    template<typename K, typename V>
    class Node {
    public:
        Node() = default;

        Node(K, V, size_t);

        ~Node() = default;

        [[nodiscard]] K get_key() const;

        [[nodiscard]] V get_value() const;

        [[nodiscard]] size_t get_level() const;

        void set_value(V);

        // next数组
        std::vector<Node<K, V> *> forward_;

    private:
        K key_;
        V value_;
        // 节点高度
        size_t level_{};
    };
}// namespace skip_list

template<typename K, typename V>
skip_list::Node<K, V>::Node(const K k, const V v, const size_t level)
    : key_(k), value_(v), level_(level) {
    this->forward_.assign(level + 1, nullptr);
}

template<typename K, typename V>
K skip_list::Node<K, V>::get_key() const {
    return key_;
}

template<typename K, typename V>
V skip_list::Node<K, V>::get_value() const {
    return value_;
}

template<typename K, typename V>
size_t skip_list::Node<K, V>::get_level() const {
    return level_;
}

template<typename K, typename V>
void skip_list::Node<K, V>::set_value(const V v) {
    this->value_ = value_;
}